﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
#if !PHONE
using System.ComponentModel.DataAnnotations;
#endif
using System.Security.Principal;
using System.ComponentModel;

namespace Tiscs.Practices.Web.Services
{
    /// <summary>
    /// 用户类基类。
    /// </summary>
    public abstract class UserBase : IPrincipal, IIdentity, INotifyPropertyChanged
    {
        /// <summary>
        /// 默认构造方法。
        /// </summary>
        public UserBase()
        {
        }

        /// <summary>
        /// 获取或设置用户名。
        /// </summary>
#if !PHONE
        [Key]
#endif
        public string Name { get; set; }

        /// <summary>
        /// 获取当前用户的角色列表。
        /// </summary>
#if !PHONE
        [Editable(false)]
#endif
        public IEnumerable<string> Roles { get; set; }

        /// <summary>
        /// 获取指示当前用户是否已经登录的布尔值。
        /// </summary>
        public bool IsAuthenticated
        {
            get
            {
                return !string.IsNullOrEmpty(this.Name);
            }
        }

        /// <summary>
        /// 获取当前用户标识示例。
        /// </summary>
        public IIdentity Identity
        {
            get
            {
                return this;
            }
        }

        /// <summary>
        /// 判断用户是否在指定的角色中。
        /// </summary>
        /// <param name="role">角色名称。</param>
        /// <returns>用户是否在制定的角色中。</returns>
        public bool IsInRole(string role)
        {
            return Roles != null && Roles.Contains(role);
        }

        /// <summary>
        /// 获取用户登录验证类型。
        /// </summary>
        public string AuthenticationType
        {
            get
            {
                return string.Empty;
            }
        }

        /// <summary>
        /// 触发属性变更事件。
        /// </summary>
        /// <param name="propertyName">发生变化的属性名称。</param>
        protected void RaisePropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        /// <summary>
        /// 继承自<see cref="INotifyPropertyChanged"/>接口的事件。
        /// 属性变化通知事件。
        /// </summary>
        public event PropertyChangedEventHandler PropertyChanged;
    }
}
